<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <o:p></o:p>111
    </div>
</body>
<script>
    /**
    * @param obj:要在其上定义属性的对象，prop：要定义或修改的属性名称，descriptor:将被定义或修改的属性描述符
    * 
    **/
    // Object.defineProperty(obj,prop,descriptor)
    // 栗子
    let obj = {}
    Object.defineProperty(obj, 'name', {
        value: 'Mary',
        writable :true, //当且仅当该属性的 writable 为 true 时，该属性才能被赋值运算符改变。默认为 false。
        enumerable :true, //当且仅当该属性的 enumerable 为 true 时，该属性才能够出现在对象的枚举属性中。默认为 false。
        configurable :true //当且仅当该属性的 configurable 为 true 时，该属性描述符才能够被改变，也能够被删除。默认为 false。
    })
    console.log(obj)
    // setter or getter
    let value = "Amelia"
    Object.defineProperty(obj,'name', {
        get() {
            console.log('执行了 get 操作')
            return value
        },
        set(newVal) {
            console.log('执行了 set 操作')
            value = newVal
        },
        configurable:true,
        enumerable:true
    })
    obj.name = 'AmeliaT'  // 执行了 set 操作
    console.log(obj.name)

</script>

</html>